# race_manager.gd
extends Node

# ======================================================
# 种族管理器
# 负责管理和查询种族数据
# ======================================================

#region 属性
# ------------------------------------------------------


# 初始化标记
var _initialized := false
# 单例
#endregion

#region 初始化方法
# ------------------------------------------------------
func _ready() -> void:
	_initialize()

# 初始化种族数据
func _initialize():
	"""
	初始化种族管理器，从GameData中加载种族数据。
	确保只初始化一次。
	"""
	if _initialized:
		return


	_initialized = true
#endregion

#region 数据查询扩展
# ------------------------------------------------------
func get_race_by_name(race_name: String) -> Dictionary:
	"""
	根据种族名称获取对应的种族数据。
	@param race_name: 要查找的种族名称
	@return: 包含种族数据的字典，如果找不到则返回空字典
	"""
	_initialize() # 确保完成初始化
	
	# 获取种族数据
	var race = GameData.race_data.get(race_name, {})
	return race

func get_all_races() -> Dictionary:
	"""
	获取所有已加载的种族数据。
	@return: 包含全部种族数据的字典
	"""
	_initialize() # 确保完成初始化
	
	return GameData.race_data.duplicate()

func get_starting_units_by_race(race_name: String) -> Array:
	"""
	根据种族名称获取初始兵种列表。
	@param race_name: 要查找的种族名称
	@return: 包含初始兵种名称的数组，如果找不到则返回空数组
	"""
	_initialize() # 确保完成初始化
	
	var race = GameData.race_data.get(race_name, {})
	return race.get("starting_units", [])

func get_economic_efficiency_by_race(race_name: String) -> float:
	"""
	根据种族名称获取经济效率。
	@param race_name: 要查找的种族名称
	@return: 经济效率倍率，如果找不到则返回1.0
	"""
	_initialize() # 确保完成初始化
	
	var race = GameData.race_data.get(race_name, {})
	return race.get("economic_efficiency", 1.0)

func get_random_races(count: int = 3) -> Array:
	"""
	根据指定数量随机获取种族数据。
	@param count: 需要获取的种族数量（默认为3）
	@return: 包含随机种族名称的数组
	"""
	_initialize() # 确保完成初始化

	# 获取所有种族名称
	var all_races := GameData.race_data.keys()
	if all_races.size() == 0:
		push_warning("没有可用的种族数据")
		return []

	# 如果请求的数量超过可用种族数量，则返回所有种族
	if count >= all_races.size():
		return all_races.duplicate()

	# 使用 GameManager 的随机数生成器进行随机选择
	var selected_races := []
	var remaining_pool := all_races.duplicate()

	for i in range(count):
		var rand_idx = GameManager.rng.randi_range(0, remaining_pool.size() - 1)
		selected_races.append(remaining_pool[rand_idx])
		remaining_pool.pop_at(rand_idx)

	return selected_races
#endregion
